home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / umich / utils / tosfixes / hsmoda05.lzh / HSM_DOKU / MIDI_X.TXT < prev    next >
Text File  |  1995-01-22  |  11KB  |  239 lines

  1. MIDI.PRG
  2. ********
  3.  
  4. (The English part is appended at the German, look for it.)
  5.  
  6. Dies ist ein Treiber zur Nutzung der MIDI-Schnittstelle über die in 
  7. SERSOFST.TXT definierten Filefunktionen.
  8.  
  9.  
  10. Allgemeines
  11. -----------
  12. ########## momentan ist das noch eine Experimentalversion ###########
  13. Dieser Treiber gehört zum HSMODA-Paket. Er ist nicht für Musiksoftware 
  14. gedacht, die die MIDI-Schnittstelle zu ihrem ursprünglichen Zweck benutzt, 
  15. sondern zur "ganz normalen" Datenübertragung. Wer die MIDI-Schnittstelle 
  16. nicht zur "ganz normalen" Datenübertragung nutzt, braucht diesen Treiber 
  17. nicht.
  18.  
  19.  
  20. Kommunikationsparameter
  21. -----------------------
  22. Es wird alles unterstützt, was das ACIA und die RxD/TxD-Schnittstelle 
  23. können.
  24. Baudraten: 31250, 7812
  25. Handshake: "keiner", "XON/XOFF"
  26. Zeichenformate: 7e2, 7o2, 7e1, 7o1, 8n2, 8n1, 8e1, 8o1
  27.  
  28.  
  29. Konfiguration
  30. -------------
  31. Die Konfiguration erfolgt mit dem SETTER.TTP. Zur Bedienung siehe 
  32. SETTER.TXT.
  33.  
  34. Momentan kann man nur die Empfangs- und Sendepuffergröße einstellen, die 
  35. standardmäßig 256 Byte geträgt.
  36.  
  37.  
  38.  
  39. (Interna:) Implementierungsvarianten
  40. ------------------------------------
  41. Das Senden erfolgt auch interruptgesteuert. Falls man im Sendeinterrupt 
  42. nochmal extra Statusregister Bit1 abfragt (braucht man auch nicht, denn 
  43. wenn im Polling gesendet wird, dann ist der Sendepuffer per Definition 
  44. leer (sonst gibt es sowieso Chaos), und es kann deshalb ohnehin nichts in 
  45. den ACIA geschrieben werden), braucht man Midiws und Bconout-MIDI nicht 
  46. abzufangen, da diese direkt im Polling senden und die Strukturen dieses 
  47. Treibers nicht stören. Sie könnten sich zwar in eine Interruptsendung 
  48. einmischen, das sollte aber nicht passieren, da entweder alte Programme 
  49. diese nicht-Interrupt-Aufrufe benutzen (wo das Polling-Midiws 
  50. möglicherweise zwecks Kompatibilität nötig ist) oder neue Programme über 
  51. GEMDOS oder die höhere BIOS-Nummer arbeiten. Da nämlich MIDI im BIOS nicht 
  52. immer #3 ist, muß man ohnehin im RSVF die Nummer eines extra eingehängten 
  53. Treibers eintragen und nur zu Kompatibilitätszwecken das alte #3 
  54. unterstützen.
  55.  
  56. Es ist zu entscheiden, wie weit man die Optimierung (tausche Speicherplatz 
  57. und Übersichtlichkeit gegen Geschwindigkeit) treibt. 31250Bd bedeutet beim 
  58. Empfang eine Interruptfrequenz von 3125Hz bei 8N1 und eine zu 
  59. unterschreitende Interruptantwortzeit von 320us. Der 68000/8MHz braucht 
  60. 0.5us für einen WORD-Speicherzugriff. Beim im TOS vorhandenen Sichern von 
  61. 8 Registern (als LONG) vergehen also schon 8us, zusätzlich zu der reinen 
  62. Reaktionszeit der CPU. Nach der Bearbeitung werden nochmal 8us im 
  63. Interrupt zur Wiederherstellung verbraucht. Der IKBD-ACIA ist mit 7812.5Bd 
  64. vergleichsweise langsam.
  65.  
  66. Direkt im MFP-Interrupt, sehr schnell, alle MIDI-Vektoren in KBDVECS sind 
  67. tot. ### Genau so mache ich es erstmal ### !!! Dürfte evtl mit einiger 
  68. Musiksoft inkompatibel sein, egal.
  69.  
  70. ### momentan BIOS-Funktionen nur über eigene Nummer, alte BIOS und 
  71. XBIOS-IOREC-MIDI noch nicht ersetzt (aufruf kann zu Absturz, Hängenbleiben 
  72. oder so führen), Nummer siehe RSVF-Objekt ####
  73.  
  74. Schmeißt bei Installation alles andere aus dem MFP-I4-Interrupt raus, wie 
  75. z.B. Templmon. (Also Templmon erst nach diesem Treiber starten)
  76.  
  77.  
  78.  
  79. Andere Varianten, evtl mal alternativ realisieren:
  80.  
  81. Nur als midisys(), etwas langsamer, nur midivec() und vmiderr() tot.
  82.  
  83. Als midisys(), langsamst, midivec() und vmiderr() werden benutzt, 
  84. restliche Interruptbedingungen bearbeitet midisys() selbst.
  85.  
  86.  
  87.  
  88.  
  89. (Für Programmierer:) Die MIDI-Schnittstelle auf der Softwareseite
  90. =================================================================
  91.  
  92. Im TOS werden MIDI-Daten immer direkt gesendet. Es gibt keinen 
  93. Sende-IOREC. Nur Empfangsdaten werden im Interrupt behandelt, ein 
  94. Empfangs-IOREC existiert (XBIOS 14 Iorec (Gerät 2)). XBIOS 15 Rsconf 
  95. existiert nicht. Zusätzlich gibt es XBIOS 12 Midiws zum Versenden von 
  96. Bytefolgen. Diese Funktion arbeitet im Polling. Im BIOS ist MIDI 
  97. normalerweise Gerät 3, außer bei BIOS 8 Bcostat, dort ist es 4.
  98.  
  99. XBIOS 34 Kbdvbase liefert einen Datenblock, der Zeiger auf einige Routinen 
  100. enthält, die mit MIDI und dem IKBD zusammenhängen. Leider werden diese 
  101. Routinen oft falsch beschrieben, auch im Profibuch sind Fehler drin.
  102.  
  103. MIDI-ACIA und IKBD-ACIA liefern ihre Interruptmeldung aktiv-oder-verknüpft 
  104. (ihre L-aktiven Open Collector Ausgänge sind miteinander verbunden) über 
  105. den gleichen Eingang (I4) des MFP (ST-MFP), der auf den 
  106. MFP-Interruptvektor auf Adresse $0118 führt.
  107.  
  108. Hier lauert bereits die erste Falle: Der MFP erzeugt einen Interrupt nur 
  109. bei einer H/L-Flanke am I4-Eingang. Diese Flanke tritt nur beim Wechsel 
  110. von "beide ACIA wollen keinen Interrupt" zu "mindestens ein ACIA fordert 
  111. Interrupt" auf. Setzt man jetzt die Interruptforderung nur im MFP zurück 
  112. und bearbeitet nicht beide ACIA so lange, bis I4 wieder H wird, so bleibt 
  113. I4 auf L und der MFP wird keine ACIA-Interrupts mehr melden. Dieser Fall 
  114. kann z.B. eintreten, wenn in einer sehr frühen Phase der 
  115. Systeminitialisierung Daten über den MIDI-Port reinkommen.
  116.  
  117.  
  118. Kbdvbase (XBIOS 34)
  119. -------------------
  120. Diese Funktion liefert einen Zeiger auf einen Datenblock mit Zeigern auf 
  121. verschiedene Routinen im Zusammenhang mit MIDI und IKBD.
  122.  
  123. typedef struct {
  124.  void (*midivec)();  /* Midi-Eingabe */
  125.  void (*vkbderr)();  /* Tastaturfehler (default: nur RTS) */
  126.  void (*vmiderr)();  /* MIDIfehler (default: nur RTS) */
  127.  void (*statvec)();  /* Status des IKBD gelesen (default: nur RTS) */
  128.  void (*mousevec)(); /* Mausabfrage */
  129.  void (*clockvec)(); /* Uhrzeitabfrage */
  130.  void (*joyvec)();   /* Joystickabfrage (default: nur RTS) */
  131.  void (*midisys)();  /* MIDI-Systemvektor */
  132.  void (*ikbdsys)();  /* IKBD-Systemvektor */
  133.  WORD drvstat;       /* IKBD-Treiberstatus (benutzt als zwei Bytes) */
  134. } KBDVECS;
  135.  
  136. Erzeugt I4 des MFP einen Interrupt, so werden in der Serviceroutine 
  137. nacheinander midisys() und ikbdsys() aufgerufen. Falls I4 jetzt immer noch 
  138. L (also aktiv) ist, wird der Aufruf dieser beiden Routinen solange 
  139. wiederholt, bis I4 nach der Bearbeitung von ikbdsys() endlich H ist. Dann 
  140. wird der Interrupt im MFP als bearbeitet markiert und die Serviceroutine 
  141. beendet. Die XXXXsys() müssen selbst anhand des Statusregisters ihrer ACIA 
  142. feststellen, ob sie arbeiten oder gleich zurückkehren. Vor dem Aufruf der 
  143. Routinen wurden die Register A0-A3/D0-D3 gesichert, so daß man sie 
  144. benutzen kann. Sicherheitshalber sollte man aber nur A0-A2/D0-D2 nutzen, 
  145. wie es die Konventionen der meisten C-Compiler auf dem Atari erlauben. 
  146. Diese ganzen Aktionen laufen bei einem Interrupt Priority Level von 6 ab, 
  147. so daß keine weiteren Interrupts dazwischen kommen können. Wenn man den 
  148. IPL heruntersetzt (zeitweilig in der XXXXsys-Routine), so können vom MFP aus 
  149. wenigstens höherpriorisierte Interrupts wie der für MODEM1 
  150. dazwischenkommen.
  151.  
  152. vmiderr() und vkbderr() werden von midisys() bzw. ikbdsys() aufgerufen, 
  153. wenn ein Empfangspufferüberlauf vorlag. Das empfangene Zeichen wird 
  154. trotzdem in D0.b übergeben. Die Fehlerbedingung wurde im ACIA bereits 
  155. zurückgesetzt. Andere Fehlerbedingungen werden ignoriert und führen nicht 
  156. zum Aufruf der vXXXerr(). Falls man eigene XXXXsys()-Routinen einsetzt, 
  157. werden die vXXXerr() also nur noch aufgerufen, wenn es die eigene 
  158. XXXXsys()-Routine tut. Die vXXXerr() dürfen A0-A2/D0-D2 benutzen und 
  159. bestehen im TOS nur aus einem RTS.
  160.  
  161. midivec() wird von midisys() aufgerufen, wenn ein Zeichen von der 
  162. MIDI_ACIA fehlerfrei empfangen wurde. Das Zeichen wird in D0.b übergeben. 
  163. Die Routine darf A0-A2/D0-D2 benutzen und schreibt im TOS das Zeichen in 
  164. den MIDI-Empfangspuffer.
  165.  
  166. Alle anderen Routinen werden von ikbdsys() aufgerufen, nachdem ikbdsys 
  167. alle Byte empfangen hat, die zu dem entsprechenden Paket gehören. Diese 
  168. Byte wurden in einem Puffer gesammelt und der Routine wird ein Zeiger auf 
  169. diesen Puffer im Register A0 und auf dem Stack übergeben. Die Routinen 
  170. dürfen A0-A2/D0-D2 benutzen. Sie sollten so kurz wie möglich sein, denn 
  171. eine Laufzeit von 1ms (wie im Profibuch angegeben) begrenzt die über 
  172. MODEM1 fehlerfrei empfangba